/**
 * 
 */
package com.ubo.java.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import com.ubo.java.associations.AssociationManager;
import com.ubo.java.associations.Card;
import com.ubo.java.associations.EAssociationType;
import com.ubo.java.model.classifier.IClassifier;
import com.ubo.transform.java.IJavaGenerable;
import com.ubo.transform.java.IJavaVisitor;
import com.ubo.util.Duo;

/**
 * Classe représentant un modèle JAVA.
 * 
 * @author saludegu
 * 
 */
public class JavaModel implements IJavaGenerable {

	/**
	 * Liste des éléménts contenus dans le modele.
	 */
	protected List<IClassifier> mListElements;

	/**
	 * Gestionnaire d'associations.
	 */
	protected AssociationManager mAssociationManager;

	/**
	 * Model des packages.
	 */
	protected PackageModel mPackageModel;

	/**
	 * 
	 * Constructor
	 * 
	 */
	public JavaModel(PackageModel packageModel) {
		mListElements = new ArrayList<IClassifier>();
		mAssociationManager = new AssociationManager();
		mPackageModel = packageModel;
	}

	/**
	 * Ajout d'un classifier au modèle.
	 * 
	 * @param classifier
	 */
	public void addClassifier(IClassifier classifier) {
		mListElements.add(classifier);
	}

	/**
	 * Ajout d'une collection de classifiers au modèle.
	 * 
	 * @param classifiers
	 */
	public void addClassifiers(Collection<IClassifier> classifiers) {
		mListElements.addAll(classifiers);
	}

	/**
	 * Getter de la liste des classifiers enregistrés dans le modèle.
	 * 
	 * @return
	 */
	public List<IClassifier> getClassifiers() {
		return mListElements;
	}

	/**
	 * Ajout d'une association.
	 * 
	 * @param from
	 * @param to
	 */
	public void addAssociation(IClassifier from, IClassifier to,
			EAssociationType associationType, Card card1, Card card2) {
		mAssociationManager.addAssociation(new Duo<Integer, IClassifier>(
				mAssociationManager.giveId(from), from),
				new Duo<Integer, IClassifier>(mAssociationManager.giveId(to),
						to), associationType, card1, card2);
	}

	/**
	 * Getter du gestionnaire association.
	 * 
	 * @return
	 */
	public AssociationManager getAssociationManager() {
		return mAssociationManager;
	}

	/**
	 * @see com.ubo.transform.java.IJavaGenerable#generate(com.ubo.transform.java.IJavaVisitor)
	 */
	@Override
	public void generate(IJavaVisitor<?> generator) {
		generator.generate(this);
	}

}
